
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedList;
import javax.swing.JOptionPane;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Jobson
 */
public class Caderneta extends javax.swing.JFrame {

    /**
     * Creates new form Caderneta
     */
    public Caderneta() {
        initComponents();
        disciplinas = new LinkedList<Disciplina>();
        alunos = new LinkedList<Aluno>();
        sequencial = 1;
        setupLer();
        readRecords();
        cleanupLer();
        dispose();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        desktop = new javax.swing.JDesktopPane();
        jMenuBar1 = new javax.swing.JMenuBar();
        menuDic = new javax.swing.JMenu();
        menuNovaDic = new javax.swing.JMenuItem();
        menuMatAluno = new javax.swing.JMenuItem();
        menuCadNotasFaltas = new javax.swing.JMenuItem();
        menuAluno = new javax.swing.JMenu();
        menuNovoAluno = new javax.swing.JMenuItem();
        menuConsAluno = new javax.swing.JMenuItem();
        menuSair = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMaximumSize(new java.awt.Dimension(1300, 700));
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        desktop.setBackground(new java.awt.Color(204, 204, 204));

        menuDic.setText("Disciplina");

        menuNovaDic.setText("Nova Disciplina");
        menuNovaDic.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuNovaDicActionPerformed(evt);
            }
        });
        menuDic.add(menuNovaDic);

        menuMatAluno.setText("Matricular Aluno");
        menuMatAluno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuMatAlunoActionPerformed(evt);
            }
        });
        menuDic.add(menuMatAluno);

        menuCadNotasFaltas.setText("Cadastrar Notas/Faltas");
        menuCadNotasFaltas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuCadNotasFaltasActionPerformed(evt);
            }
        });
        menuDic.add(menuCadNotasFaltas);

        jMenuBar1.add(menuDic);

        menuAluno.setText("Aluno");

        menuNovoAluno.setText("Novo Aluno");
        menuNovoAluno.setToolTipText("");
        menuNovoAluno.setName(""); // NOI18N
        menuNovoAluno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuNovoAlunoActionPerformed(evt);
            }
        });
        menuAluno.add(menuNovoAluno);

        menuConsAluno.setText("Relatório do Aluno");
        menuConsAluno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuConsAlunoActionPerformed(evt);
            }
        });
        menuAluno.add(menuConsAluno);

        jMenuBar1.add(menuAluno);

        menuSair.setText("Sair");
        menuSair.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                menuSairMousePressed(evt);
            }
        });
        jMenuBar1.add(menuSair);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(desktop, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(desktop, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void menuNovoAlunoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuNovoAlunoActionPerformed
        // TODO add your handling code here:
        CadastroAluno telaCadastro = new CadastroAluno();
        desktop.add(telaCadastro);
        telaCadastro.setVisible(true);
    }//GEN-LAST:event_menuNovoAlunoActionPerformed
    
    private void menuNovaDicActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuNovaDicActionPerformed
        CadastroDisciplina telaCadastro = new CadastroDisciplina();
        desktop.add(telaCadastro);
        telaCadastro.setVisible(true);
    }//GEN-LAST:event_menuNovaDicActionPerformed
    
    private void menuConsAlunoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuConsAlunoActionPerformed
        // TODO add your handling code here:

        if (alunos.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Nenhum aluno cadastrado");
            return;
        } else {
            String mat = JOptionPane.showInputDialog("Matricula:");
            Aluno aluno = null;
            LinkedList<Disciplina> dicsMatriculadas = new LinkedList<Disciplina>();
            for (Aluno a : alunos) {
                if (a.getMatricula().equals(mat)) {
                    aluno = a;
                    for (Disciplina d : disciplinas) {
                        for (String m : d.getMatriculados()) {
                            if (m.equals(mat)) {
                                dicsMatriculadas.add(d);
                                break;
                            }
                        }
                    }
                    break;
                }
            }
            if (aluno == null) {
                JOptionPane.showMessageDialog(this, "Aluno não encontrado");
            } else {
                ConsultaAluno telaconsulta = new ConsultaAluno(aluno, dicsMatriculadas);
                this.desktop.add(telaconsulta);
                telaconsulta.setVisible(true);
            }
        }
    }//GEN-LAST:event_menuConsAlunoActionPerformed
    
    private void menuMatAlunoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuMatAlunoActionPerformed
        // TODO add your handling code here:

        if (alunos.isEmpty() || disciplinas.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Deve haver ao menos um aluno e uma disciplina cadastrados");
        } else {
            String mat = JOptionPane.showInputDialog("Matrícula:");
            Aluno aluno = null;
            for (Aluno a : alunos) {
                if (a.getMatricula().equals(mat)) {
                    aluno = a;
                    break;
                }
            }
            if (aluno != null) {
                MatriculaAluno telaMatricula = new MatriculaAluno(aluno, disciplinas);
                desktop.add(telaMatricula);
                telaMatricula.setVisible(true);
            } else {
                JOptionPane.showMessageDialog(this, "Aluno não encontrado");
            }
        }
    }//GEN-LAST:event_menuMatAlunoActionPerformed
    
    private void menuSairMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_menuSairMousePressed
        // TODO add your handling code here:
        setupGravar();
        addRecords();
        cleanupGravar();
        dispose();
        System.exit(0);
    }//GEN-LAST:event_menuSairMousePressed
    
    private void menuCadNotasFaltasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuCadNotasFaltasActionPerformed
        // TODO add your handling code here:
        if (disciplinas.isEmpty() || alunos.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Deve haver ao menos um aluno e uma disciplina cadastrados");
        } else {
            CadastroNotasFaltas telaNotasFaltas = new CadastroNotasFaltas();
            desktop.add(telaNotasFaltas);
            telaNotasFaltas.setVisible(true);
        }
    }//GEN-LAST:event_menuCadNotasFaltasActionPerformed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        // TODO add your handling code here:
        setupGravar();
        addRecords();
        cleanupGravar();
        dispose();
        System.exit(0);
    }//GEN-LAST:event_formWindowClosing
    static private LinkedList<Disciplina> disciplinas;
    static private LinkedList<Aluno> alunos;
    static private int sequencial;
    static private String[] cursos = new String[]{
        "101 Agroindústria",
        "102 Agronomia",
        "103 Licenciatura em Ciências Agrárias",
        "104 Zootecnia",
        "105 Medicina Veterinária",
        "106 Agroecologia",
        "107 Tecnologia de Alimentos",
        "108 Tecnologia de Alimentos ",
        "109 Tecnologia em Produção Sucroalcooleira ",
        "110 Tecnologia em Produção Sucroalcooleira ",
        "201 Ciências Biológicas (Lic.)  ",
        "202 Ciências Biológicas (Lic.) ",
        "203 Educação Física (Lic.) ",
        "204 Enfermagem ",
        "205 Farmácia ",
        "206 Fisioterapia ",
        "207 Medicina ",
        "208 Nutrição ",
        "209 Odontologia ",
        "210 Ciências Biológicas (Lic.) ",
        "211 Ecologia ",
        "212 Ciências Biológicas (Bach.) ",
        "213 Educação Física (Bach.) ",
        "214 Fonoaudiologia ",
        "215 Terapia Ocupacional  ",
        "216 Ciências Biológicas (Bach.)  ",
        "217 Biotecnologia ",
        "301 Arquitetura e Urbanismo ",
        "302 Ciências da Computação (Bach.) ",
        "303 Engenharia Civil ",
        "304 Engenharia de Alimentos  ",
        "305 Engenharia de Produção Mecânica  ",
        "306 Engenharia Mecânica ",
        "307 Estatística  ",
        "308 Física (Bach) ",
        "309 Física (Lic.) ",
        "310 Matemática (Lic.) ",
        "311 Matemática (Lic.)  ",
        "312 Química (Lic.) ",
        "313 Química (Lic.) ",
        "314 Química Industrial ",
        "317 Ciências da Computação (Lic.) ",
        "318 Design (Bach.) ",
        "319 Matemática (Lic.) ",
        "320 Sistemas de Informação (Bach.) ",
        "321 Química (Bach.)  ",
        "322 Engenharia Ambiental ",
        "323 Engenharia Elétrica ",
        "324 Engenharia de Materiais ",
        "325 Engenharia Química ",
        "326 Engenharia de Produção ",
        "327 Engenharia de Computação ",
        "328 Matemática (Bach.) ",
        "330 Matemática Computacional (Bach) ",
        "331 Química (Bach.) ",
        "332 Química (Lic.)  ",
        "333 Engenharia de Energias Renováveis  ",
        "401 Administração  ",
        "402 Administração ",
        "403 Administração ",
        "404 Administração ",
        "405 Biblioteconomia ",
        "406 Ciências Contábeis ",
        "407 Ciências Contábeis ",
        "408 Ciências Econômicas ",
        "409 Ciências Econômicas ",
        "410 Ciências Sociais (Bach.) ",
        "411 Comunicação Social - Jornalismo ",
        "412 Comunicação Social – Rel. Públicas ",
        "413 Comunicação Social - Radialismo ",
        "414 Direito ",
        "416 Direito ",
        "419 Filosofia (Lic.) ",
        "420 Geografia (Bach.) ",
        "421 Geografia (Bach.) ",
        "422 História (Lic.) ",
        "423 História (Lic.) ",
        "424 Letras – Português (Lic.) ",
        "425 Letras – Português (Lic.) ",
        "427 Pedagogia (Lic.)  ",
        "428 Pedagogia (Lic.)  ",
        "429 Pedagogia (Lic.) ",
        "430 Psicologia –  ",
        "431 Serviço Social ",
        "432 Serviço Social ",
        "433 Turismo  ",
        "436 Antropologia (Bach.) ",
        "438 Hotelaria (Bach.) ",
        "439 Ciências Contábeis  ",
        "440 Secretariado Executivo Bilíngue (Bach.) ",
        "443 Letras – Inglês (Lic.) ",
        "444 Letras – Inglês (Lic.)  ",
        "445 Letras - Espanhol (Lic.)  ",
        "446 Letras – Francês (Lic.)  ",
        "447 Letras – Francês (Lic.)  ",
        "448 Pedagogia (Lic.)  ",
        "449 Pedagogia (Lic.) ",
        "450 Ciências Sociais (Lic.) ",
        "451 Pedagogia (Lic.) ",
        "452 Arquivologia (Bach.) ",
        "454 Letras – L. Clássicas (Grego e Latim) ",
        "457 Direito  ",
        "458 Direito ",
        "459 Língua Estrangeira aplicada a Negociações Internacionais (Bach.) ",
        "460 Pedagogia – Área de Aprofundamento: Educação do Campo (Lic.) ",
        "461 Psicopedagogia (Bach.) ",
        "462 Relações Internacionais (Bach.) ",
        "463 Relações Internacionais (Bach.) ",
        "465 Comunicação em Mídias Digitais (Bach.) ",
        "466 Tradução (Bach.) ",
        "467 Tecnologia em Gestão Pública  ",
        "468 Tecnologia em Gestão Pública  ",
        "471 Ciências Atuariais ",
        "472 Ciências Atuariais ",
        "473 Filosofia (Bach.) ",
        "474 Psicopedagogia (Bach.)  ",
        "475 Ciências das Religiões (Bach.) ",
        "476 Cinema e Audiovisual (Bach.)  ",
        "477 Letras – Português (Lic.)  ",
        "478 Gastronomia (Bach.) ",
        "501 Artes Visuais (Lic.)  ",
        "502 Música (Bacharelado) ",
        "503 Música (Lic.) ",
        "505 Teatro (Bach.) ",
        "506 Artes Visuais (Bach.) ",
        "507 Dança (Lic.)"};
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JDesktopPane desktop;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenu menuAluno;
    private javax.swing.JMenuItem menuCadNotasFaltas;
    private javax.swing.JMenuItem menuConsAluno;
    private javax.swing.JMenu menuDic;
    private javax.swing.JMenuItem menuMatAluno;
    private javax.swing.JMenuItem menuNovaDic;
    private javax.swing.JMenuItem menuNovoAluno;
    private javax.swing.JMenu menuSair;
    // End of variables declaration//GEN-END:variables

    public static LinkedList<Disciplina> getDisciplinas() {
        return disciplinas;
    }
    
    public static void setDisciplinas(LinkedList<Disciplina> disciplinas) {
        Caderneta.disciplinas = disciplinas;
    }
    
    public static LinkedList<Aluno> getAlunos() {
        return alunos;
    }
    
    public static void setAlunos(LinkedList<Aluno> alunos) {
        Caderneta.alunos = alunos;
    }
    
    public static int getSequencial() {
        return sequencial;
    }
    
    public static void setSequencial(int sequencial) {
        Caderneta.sequencial = sequencial;
    }
    
    public static String[] getCursos() {
        return cursos;
    }
    
    public static void setCursos(String[] cursos) {
        Caderneta.cursos = cursos;
    }
    
    public static void incrementaSequencial() {
        sequencial++;
    }
    /*MÉTODOS E VARIÁVEIS DE LEITURA  E GRAVAÇÃO EM ARQUIVO*/
    private DataOutputStream output;
    private DataInputStream input;
    
    public void cleanupGravar() {
        try {
            output.flush();
            output.close();
        } catch (IOException e) {
            System.err.println("Falha no Fechamento do Arquivo - Durante Gravação!!\n" + e.toString());
            System.exit(1);
        }
    }
    
    public void addRecords() {
        //Carrega toda a coleção no arquivo
        try {
            output.writeInt(sequencial);
            output.writeInt(alunos.size());
            for (Aluno a : alunos) {
                output.writeUTF(a.getNome());
                output.writeUTF(a.getMatricula());
                output.writeUTF(a.getCurso());
                output.writeInt(a.getAnoIng());
                output.writeInt(a.getPeriodo());
            }
            output.writeInt(disciplinas.size());
            for (Disciplina dic : disciplinas) {
                output.writeUTF(dic.getNome());
                output.writeInt(dic.getIndiceCH());
                output.writeInt(dic.getQtdeVagas());
                output.writeInt(dic.getQtdeMatriculados());
                for (String mat : dic.getMatriculados()) {
                    output.writeUTF(mat);
                }
                for (double[] notas : dic.getNotas()) {
                    for (int i = 0; i < dic.getQtdeNotas(); i++) {
                        output.writeDouble(notas[i]);
                    }
                }
                for(boolean[] sets : dic.getSets()){
                    for (int i = 0; i < dic.getQtdeNotas(); i++) {
                        output.writeBoolean(sets[i]);
                    }
                }
                for(int[] faltas : dic.getFaltas()){
                    output.writeInt(faltas[0]);
                }
            }
            
        } catch (IOException e) {
            System.err.println("Erro durante gravação no arquivo\n" + e.toString());
            System.exit(1);
        }
    }
    
    public void setupGravar() {
        //Abre arquivo para gravar
        try {
            output = new DataOutputStream(new FileOutputStream("dados.dat", false));
        } catch (IOException e) {
            System.err.println("Falha na Abertura do Arquivo para Gravação\n" + e.toString());
            System.exit(1);
        }
    }
    
    public void cleanupLer() {
        //Fechar o arquivo, após ter sido descarregado na coleção
        try {
            input.close();
        } catch (IOException e) {
            System.err.println("Falha no Fechamento do Arquivo durante Leitura\n" + e.toString());
            System.exit(1);
        }
    }
    
    public void readRecords() {
//Carrega todo o conteúdo do arquivo na Coleção cadcel
        
        try {
            sequencial = input.readInt();
            for( int i = input.readInt() ; i > 0 ; --i ){
                String nome = input.readUTF();
                String matr = input.readUTF();
                String curs = input.readUTF();
                int ano = input.readInt();
                int per = input.readInt();
                alunos.add(new Aluno(nome, matr, curs, ano, per));
            }
            for( int i = input.readInt() ; i > 0 ; --i){
                String nome = input.readUTF();
                int indiceCH = input.readInt();
                int qtdevagas = input.readInt();
                Disciplina disc = new Disciplina(nome, indiceCH, qtdevagas);
                disc.setQtdeMatriculados(input.readInt());
                for( int j = disc.getQtdeMatriculados() ; j > 0 ; --j){
                    disc.getMatriculados().add(input.readUTF());
                }
                for( int j = disc.getQtdeMatriculados() ; j > 0 ; --j){
                    double[] notas = new double[disc.getQtdeNotas()]; 
                    for (int k = 0; k < disc.getQtdeNotas(); k++) {
                        notas[k] = input.readDouble();
                    }
                    disc.getNotas().add(notas);
                }
                for( int j = disc.getQtdeMatriculados() ; j > 0 ; --j){
                    boolean[] sets = new boolean[disc.getQtdeNotas()]; 
                    for (int k = 0; k < disc.getQtdeNotas(); k++) {
                        sets[k] = input.readBoolean();
                    }
                    disc.getSets().add(sets);
                }
                for( int j = disc.getQtdeMatriculados() ; j > 0 ; --j){
                    int[] faltas = new int[1];
                    faltas[0] = input.readInt();
                    disc.getFaltas().add(faltas);
                }
                disciplinas.add(disc);
            }
            
        }catch(EOFException eof){
            System.err.println("Erro durante leitura do arquivo\n" + eof.toString());
            System.exit(1);
        } 
        catch (IOException e) {
            System.err.println("Erro durante leitura do arquivo\n" + e.toString());
            System.exit(1);
        }
    }
    
    public void setupLer() {
        //Abre arquivo para leitura
        try {
            input = new DataInputStream(new FileInputStream("dados.dat"));
        } catch (IOException e) {
            System.err.println("Falha na Abertura do Arquivo para Leitura\n" + e.toString());
            System.exit(1);
        }
    }
}
